package com.school.fuyuan.common.util;

import com.school.fuyuan.common.message.ResponseHead;
import com.school.fuyuan.common.message.ResponseMsg;
import org.springframework.util.StringUtils;

import java.util.HashMap;
import java.util.Map;

/**
 * @author zrhong
 * @version 1.0
 * @date 2019/3/5 22:06
 * @description
 */
public abstract class ResponseUtils {

    /**
     * 请求成功时生成不携带数据的响应对象（requestId由Aop切面处理）
     *
     * @return ResponseMsg&lt;EabMap>
     */
    public static ResponseMsg<Map<String,Object>> success() {
        return successWithRequestIdAutoHandled(null, new HashMap<>());
    }

    /**
     * 请求成功时生成携带数据的响应对象（requestId由Aop切面处理）
     *
     * @param data 需要给响应对象携带的数据
     * @return ResponseMsg&lt;T>
     */
    public static <T> ResponseMsg<T> success(T data) {
        return successWithRequestIdAutoHandled(null, data);
    }

    /**
     * 请求成功时生成自定义响应描述且携带数据的响应对象
     *
     * @param message 自定义响应描述
     * @param data    需要给响应对象携带的数据
     * @return ResponseMsg&lt;T>
     */
    public static <T> ResponseMsg<T> success(String message, T data) {
        return successWithRequestIdAutoHandled(message, data);
    }

    /**
     * 请求成功时生成自定义响应描述且不携带数据的响应对象
     *
     * @param message 自定义响应描述
     * @return ResponseMsg&lt;EabMap>
     */
    public static ResponseMsg<Map<String,Object>> successWithMsg(String message) {
        return successWithRequestIdAutoHandled(message, new HashMap<>());
    }

    /**
     * 请求成功时生成自定义描述信息并且携带数据的响应对象（requestId由Aop切面处理）
     *
     * @param message 自定义响应描述
     * @param data    需要给响应对象携带的数据
     * @return ResponseMsg&lt;T>
     */
    public static <T> ResponseMsg<T> successWithRequestIdAutoHandled(String message, T data) {
        return success(null, message, data);
    }

    /**
     * 请求成功时生成自定义描述信息并且携带数据的响应对象
     *
     * @param requestId 请求id，请求的唯一标志
     * @param message   自定义响应描述
     * @param data      需要给响应对象携带的数据
     * @return ResponseMsg&lt;T>
     */
    public static <T> ResponseMsg<T> success(String requestId, String message, T data) {
        ResponseMsg<T> responseMsg = new ResponseMsg<>();
        ResponseHead head = new ResponseHead();
        if (StringUtils.hasText(message)) {
            head.setRespDesc(message);
        }
        responseMsg.setHead(head);
        responseMsg.setData(data);
        return responseMsg;
    }

    /**
     * 生成对请求处理失败的响应信息
     *
     * @param message   错误描述信息
     * @param data      错误数据
     * @return ResponseMsg
     */
    public static <T> ResponseMsg<T> failed(String errorCode, String message, T data) {
        ResponseMsg<T> responseMsg = new ResponseMsg<>();
        ResponseHead head = ResponseHead.buildFailedHead();
        head.setRespCode(errorCode);
        head.setRespDesc(message);
        responseMsg.setHead(head);
        responseMsg.setData(data);
        return responseMsg;
    }

    public static <T> ResponseMsg<T> failed(String errorCode, String message) {
        return failed(errorCode, message, null);
    }
}
